package br.com.werp.regras.documento.integracao;

import br.com.werp.regras.geral.ErroPadrao;
import br.com.werp.regras.geral.integracao.MasterDAO;
import br.com.werp.regras.geral.vos.documento.DocumentoFinanceiroAgrupadoVO;
import br.com.werp.regras.geral.vos.documento.DocumentoFinanceiroVO;
import br.com.werp.regras.geral.vos.documento.DocumentoVO;
import br.com.werp.regras.geral.vos.documento.DocumentoVecimentoAgrupadoVO;
import br.com.werp.regras.geral.vos.documento.TipoDocumentoDominioVO;
import br.com.werp.regras.geral.vos.tabelas.Agrupamento_documento;
import br.com.werp.regras.geral.vos.tabelas.Documento;

import java.sql.Connection;
import java.sql.SQLException;

import java.util.List;


/**
 * @author Sobreira
 * Criado em 10/07/2006
 */
public class DocumentoDAO extends MasterDAO {
    private static DocumentoDAO documentoDAO;

    private DocumentoDAO(String banco) throws Exception {
        super(banco);
    }

    public static DocumentoDAO getDocumentoDAO() throws Exception {
        if (documentoDAO == null) {
            documentoDAO = new DocumentoDAO("");
        }

        return documentoDAO;
    }

    public void apagarAgrupamento(Object key,
        Agrupamento_documento agrupamento_documento)
        throws ErroPadrao,SQLException,Exception {
        excluirVO(validarTransacao(key), agrupamento_documento);
    }

    public void apagarDocumento(Object key, Documento documento)
        throws ErroPadrao,SQLException,Exception {
        excluirVO(validarTransacao(key), documento);
    }

    public void atualizaDocumento(Object key, Documento documento)
        throws ErroPadrao,SQLException,Exception {
        String[] excluidas = new String[0];

        if (documento.getDocm_tipo() == 0) {
            excluidas = new String[] { "docm_tipo" };
        }

        atualizarVO(validarTransacao(key), documento,
            new String[] { "docm_id" }, excluidas);
    }

    public List pesquisarAgrupamentos(
        Agrupamento_documento agrupamento_documento) throws Exception {
        Connection connection = getConexao();

        try {
            return pesquisarVO(connection, agrupamento_documento);
        } finally {
            liberaConeccao(connection);
        }
    }

    public void inserirDocumento(Object key, Documento documento)
        throws ErroPadrao,SQLException,Exception {
        String[] excluidas = new String[0];

        if (documento.getDocm_tipo() == 0) {
            excluidas = new String[] { "docm_tipo" };
        }

        inserirVO(validarTransacao(key), documento, excluidas);
    }

    public List pesquisarTipoDocumentoDominioVO(
        TipoDocumentoDominioVO documentoDominioVO) throws Exception {
        Connection connection = getConexao();

        try {
            String tabelas = "tipo_documento,dominio";
            String where = " and domi_id = tdoc_dominio ";

            return pesquisarVO(connection, documentoDominioVO, where, tabelas);
        } finally {
            liberaConeccao(connection);
        }
    }

    public List obterDocumentoVoTabela(Documento documento)
        throws Exception {
        Connection connection = getConexao();

        try {
            return pesquisarVO(connection, documento);
        } finally {
            liberaConeccao(connection);
        }
    }

    public void inserirAgrupamento_documento(Object key,
        Agrupamento_documento agrupamento_documento) throws Exception {
        Connection connection = validarTransacao(key);
        inserirVO(connection, agrupamento_documento, new String[] { "apdo_id" });
    }

    public List pesquisarDocumentoVO(DocumentoVO documentoVO)
        throws Exception {
        return pesquisarDocumentoVO(getConexao(), documentoVO);
    }

    public List pesquisarDocumentoVO(Object conexao, DocumentoVO documentoVO)
        throws Exception {
        Connection connection = (Connection) conexao;

        try {
            return pesquisarVO(connection, documentoVO, "", "documento",
                documentoVO.EXCLUIDAS);
        } finally {
            if (connection.getAutoCommit()) {
                liberaConeccao(connection);
            }
        }
    }

    public List obterAgrupamentoDocumentoVoTabela(
        Agrupamento_documento agrupamento_documento) throws Exception {
        Connection connection = getConexao();

        try {
            return pesquisarVO(connection, agrupamento_documento);
        } finally {
            liberaConeccao(connection);
        }
    }
}
